#生成静态库
CXX=g++
#CXXFLAGS=-std=c++11 -g -I/usr/include/mysql -lmysqlclient -lxml2 -I/usr/local/include/libxml2 -L/usr/local/libxml2 -lpthread -D_SPANMMAP 
#CXXFLAGS=-std=c++11 -g -I/usr/include/mysql -lmysqlclient -lxml2 -I/usr/local/include/libxml2 -L/usr/local/libxml2 -lpthread -D_SPANPOOL
CXXFLAGS=-std=c++11 -g -I/usr/include/mysql -lmysqlclient -lxml2 -I/usr/local/include/libxml2 -L/usr/local/libxml2 -lpthread
OBJS=xmlParse.o qsingleton.o mallocCommon.o pageCache.o centralCache.o threadCache.o conCurrentAlloc.o picojson.o logger.o common.o mysqlDBConnPool.o

LIB_COMM=libcommon.a

#为了修改.h文件也能实现编译
#自动生成依赖
#下面是makefie的模式替换
#将OBJS以.o结尾的文件替换成.d结尾的隐藏文件，比如xmlParse.o被替换成了.xmlParse.d文件
#这里相当于定义了另外一个OBJS变量，但是都是以.d结尾的隐藏文件 .%.d 第一个点就是.，在linux中以.开头的文件会隐藏
#为什么里面的OBJS不需要$，模式替换中直接使用变量
DEPS=$(OBJS:%.o=.%.d)

#该依赖需要在include前
all:$(LIB_COMM)

#用于包含其他的 Makefile 文件或者文件列表
#然后会查找DEPS的依赖
include $(DEPS)


$(LIB_COMM):$(OBJS)
#@表示不显示执行命令
	@rm -rf $(LIB_COMM)
#生成归档库文件
	@ar -rc $(LIB_COMM) $(OBJS)
#ranlib命令用于为归档库文件（通常以.a为扩展名）生成索引。
	@ranlib $(LIB_COMM)
#归档库文件是由多个目标文件（通常是.o文件）打包而成的。在某些情况下，库文件可能没有正确的索引信息，这可能会导致链接器在使用库文件时出现问题。ranlib命令通过创建或更新库文件中的索引来解决这个问题。

#这条规则表示对于$(OBJS)中列出的每一个目标文件（.o文件），都可以由与其同名但扩展名为.cpp的源文件生成
$(OBJS):%.o:%.cpp 
	$(CXX) -c $(CXXFLAGS) $< -o $@

#gcc -M或gcc -MM（-M会包含系统头文件的依赖关系，-MM只包含用户自定义头文件的依赖关系）来自动生成依赖文件
#条规则表示对于$(DEPS)中列出的每一个依赖文件（.d隐藏文件），都可以由与其同名但扩展名为.cpp的源文件生成
$(DEPS):.%.d:%.cpp 
	@$(CXX) -M $(CXXFLAGS) $< > $@


.PHONY:clean
clean:
	rm -rf $(OBJS) $(LIB_COMM)
	rm -rf .*.d


#从makefile中学习了如何编译文件，
#如何修改了.h文件和.cpp也能重新编译
#如何生成静态库
